home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 142 / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin / tools / s44play / s44p101s.lzh / preconv.mac < prev    next >
Text File  |  2000-01-10  |  46KB  |  1,859 lines

  1. if    .macro    cond,cmd
  2.   .if cond
  3.     cmd
  4.   .endif
  5.     .endm
  6.  
  7. ;----------------------------------------------------------------
  8. Ddat    reg    d0    ;dn
  9. Rpre    reg    d1    ;dn/an
  10. Dfor    reg    d2    ;dn
  11. Rbak    reg    d3    ;dn/an
  12. Dtmp    reg    d4    ;dn
  13. Dscnt    reg    d5    ;dn
  14. Dtop    reg    d6    ;dn    sq only
  15. Adst    reg    a0    ;an    a0に固定
  16. Asrc    reg    a1    ;an    a1に固定
  17. Alim    reg    a2    ;an    preconv内はdnでもよいがデコーダの都合でanのほうがよい
  18. Ajmp    reg    a3    ;an
  19. Rsrat    reg    a4    ;dn/an
  20. Atbl    reg    a5    ;an
  21. Rsone    reg    a6    ;dn/an    const
  22.  
  23. ;----------------------------------------------------------------
  24. ;データのフォーマットごとに用意しなければならないマクロ
  25. ;    GET_DATA_0    モノラルのデータを1つ取り出すマクロ
  26. ;    GET_DATA_1    ステレオの左のデータを1つ取り出すマクロ
  27. ;    GET_DATA_2    ステレオの右のデータを1つ取り出すマクロ
  28. ;上記のマクロのパラメータ
  29. ;    マクロ名    src,dat,tmp
  30. ;        src    ソースアドレス(アドレスレジスタ)
  31. ;            デスティネーションを取り出したら,必要なサイズだけ
  32. ;            ポストインクリメントする
  33. ;        dat    デスティネーション(データレジスタ)
  34. ;            ワードサイズ,符号つき16bitのPCMを返す
  35. ;        tmp    テンポラリ(データレジスタ)
  36. ;            ロングワードで破壊可能
  37. ;例(.s44の左のデータを取り出す)
  38. ;    GET_DATA_1    .macro    src,dat,tmp
  39. ;        move.w    (src)+,dat
  40. ;        addq.l    #2,src
  41. ;        .endm
  42.  
  43. ;----------------------------------------------------------------
  44. ;周波数変換およびPCM→FMP変換処理の制御部のマクロ
  45. ;
  46. ;    PRECONV_MONO_LQ        -lqでモノラル
  47. ;    PRECONV_STEREO_LQ    -lqでステレオ
  48. ;    PRECONV_MONO_HQ        -hqでモノラル
  49. ;    PRECONV_STEREO_HQ    -hqでステレオ
  50. ;    PRECONV_MONO_SQ        -sqでモノラル
  51. ;    PRECONV_STEREO_SQ    -sqでステレオ
  52. ;
  53. ;周波数変換およびPCM→FMP変換処理の本体のマクロ
  54. ;
  55. ;    PRECONV_EQUAL_LQ    -lqで周波数が同じ
  56. ;                マクロ内でレジスタをロードしてからスタートする
  57. ;                終了時にAjmpに次回のエントリアドレスが設定される
  58. ;    PRECONV_EXIT_EQUAL_LQ    PRECONV_EQUAL_LQの出口(レジスタをセーブする)
  59. ;
  60. ;    PRECONV_UP_LQ        -lqで周波数が上がる
  61. ;                マクロ内でレジスタをロードしてからスタートする
  62. ;                終了時にAjmpに次回のエントリアドレスが設定される
  63. ;    PRECONV_EXIT_UP_LQ    PRECONV_UP_LQの出口(レジスタをセーブする)
  64. ;
  65. ;    PRECONV_DOWN_LQ        -lqで周波数が下がる
  66. ;                マクロ内でレジスタをロードしてからスタートする
  67. ;                終了時にAjmpに次回のエントリアドレスが設定される
  68. ;    PRECONV_EXIT_DOWN_LQ    PRECONV_DOWN_LQの出口(レジスタをセーブする)
  69. ;
  70. ;    -hq,-sqも同様
  71. ;
  72. ;上記のマクロのパラメータ
  73. ;    マクロ名    side
  74. ;        side    0=Mono,1=StereoLeft,2=StereoRight
  75. ;
  76. ;上記のマクロはcmp.l Alim,AsrcではなくGET_DATA_?からスタートするので,
  77. ;必要ならばバッファの初期設定(最初のブロックのADPCM→PCM変換など)を行うマクロ
  78. ;START_PRECONV_BUFFERを定義し,ここでAsrc,Alimなどの設定を行うこと.
  79. ;ステレオの場合は必ずSTART_PRECONV_BUFFERでAsrcのリワインドを行うこと.
  80. ;バッファ内のデータの前処理が必要でSTART_PRECONV_BUFFERですべてのデータを
  81. ;一度に変換できない場合は,マクロLOOP_PRECONV_BUFFERを定義してここで次のデータを
  82. ;用意し,jmp (Ajmp)によって変換を継続すること.
  83. ;変換を継続する必要がなければLOOP_PRECONV_BUFFERは空でよい.
  84. ;
  85. ;START_PRECONV_BUFFER    side
  86. ;    side    0=Mono,1=StereoLeft,2=StereoRight
  87. ;    Asrc,Alim,Adstの設定を行う(rightのときここでやる必要がある)
  88. ;    rightのAdstはleftと同じ値を返すこと
  89. ;
  90. ;LOOP_PRECONV_BUFFER    side
  91. ;    side    0=Mono,1=StereoLeft,2=StereoRight
  92. ;    周波数変換およびPCM→FMP変換処理の前にADPCMなどのデコードが必要な場合,
  93. ;    ロードしたすべてのデータをSTART_PRECONV_BUFFERまでにデコードすることが
  94. ;    できない場合がある.
  95. ;    その場合,LOOP_PRECONV_BUFFERで次のデータをデコードして変換処理を継続する
  96. ;    ことができるようになっている.
  97. ;    継続はjmp (Ajmp)で行わなければならない.
  98. ;    変換を継続する必要がなければ,LOOP_PRECONV_BUFFERは空でよい.
  99. ;    ロードしたデータの変換が終わったあとのレジスタ(Ajmpなど)のセーブは,
  100. ;    LOOP_PRECONV_BUFFERの後に実行されるPRECONV_EXIT_~で行われる.
  101.  
  102. ;----------------------------------------------------------------
  103. ;モノラル<Low Quality>
  104. PRECONV_MONO_LQ    .macro
  105.     lea.l    pcm2tl_table+32768,Atbl
  106.     cmpi.l    #65536,speed_rate
  107.     blo    @up            ;間隔が縮む→周波数が上がる
  108.     bhi    @down            ;間隔が伸びる→周波数が下がる
  109. ;間隔が同じ→周波数が同じ
  110. @equal:
  111.     START_PRECONV_BUFFER    0
  112.     PRECONV_EQUAL_LQ    0
  113.     LOOP_PRECONV_BUFFER    0
  114.     PRECONV_EXIT_EQUAL_LQ    0
  115.     bra    @done
  116.  
  117. ;間隔が縮む→周波数が上がる
  118. @up:
  119.     START_PRECONV_BUFFER    0
  120.     PRECONV_UP_LQ    0
  121.     LOOP_PRECONV_BUFFER    0
  122.     PRECONV_EXIT_UP_LQ    0
  123.     bra    @done
  124.  
  125. ;間隔が伸びる→周波数が下がる
  126. @down:
  127.     START_PRECONV_BUFFER    0
  128.     PRECONV_DOWN_LQ    0
  129.     LOOP_PRECONV_BUFFER    0
  130.     PRECONV_EXIT_DOWN_LQ    0
  131.     bra    @done
  132.  
  133. @done:
  134.     .endm
  135.  
  136. ;----------------------------------------------------------------
  137. ;モノラル<High Quality>
  138. PRECONV_MONO_HQ    .macro
  139.     lea.l    pcm2tl_table+32768,Atbl
  140.     cmpi.l    #65536,speed_rate
  141.     bhi    @down            ;間隔が伸びる→周波数が下がる
  142. ;間隔が同じ→周波数が同じ
  143. ;間隔が縮む→周波数が上がる
  144. @up:
  145.     START_PRECONV_BUFFER    0
  146.     PRECONV_UP_HQ    0
  147.     LOOP_PRECONV_BUFFER    0
  148.     PRECONV_EXIT_UP_HQ    0
  149.     bra    @done
  150.  
  151. ;間隔が伸びる→周波数が下がる
  152. @down:
  153.     START_PRECONV_BUFFER    0
  154.     PRECONV_DOWN_HQ    0
  155.     LOOP_PRECONV_BUFFER    0
  156.     PRECONV_EXIT_DOWN_HQ    0
  157.     bra    @done
  158.  
  159. @done:
  160.     .endm
  161.  
  162. ;----------------------------------------------------------------
  163. ;モノラル<Super Quality>
  164. PRECONV_MONO_SQ    .macro
  165.     lea.l    pcm2tl_table+32768,Atbl
  166.     cmpi.l    #65536,speed_rate
  167.     bhi    @down            ;間隔が伸びる→周波数が下がる
  168. ;間隔が同じ→周波数が同じ
  169. ;間隔が縮む→周波数が上がる
  170. @up:
  171.     START_PRECONV_BUFFER    0
  172.     PRECONV_UP_SQ    0
  173.     LOOP_PRECONV_BUFFER    0
  174.     PRECONV_EXIT_UP_SQ    0
  175.     bra    @done
  176.  
  177. ;間隔が伸びる→周波数が下がる
  178. @down:
  179.     START_PRECONV_BUFFER    0
  180.     PRECONV_DOWN_SQ    0
  181.     LOOP_PRECONV_BUFFER    0
  182.     PRECONV_EXIT_DOWN_SQ    0
  183.     bra    @done
  184.  
  185. @done:
  186.     .endm
  187.  
  188. ;----------------------------------------------------------------
  189. ;ステレオ<Low Quality>
  190. PRECONV_STEREO_LQ    .macro
  191.     lea.l    pcm2tl_table+32768,Atbl
  192.     cmpi.l    #65536,speed_rate
  193.     blo    @up            ;間隔が縮む→周波数が上がる
  194.     bhi    @down            ;間隔が伸びる→周波数が下がる
  195. ;間隔が同じ→周波数が同じ
  196. @equal:
  197.     START_PRECONV_BUFFER    1
  198.     move.w    preconv_rest_1,Dtmp
  199.     bpl    @f
  200.     move.b    Dtmp,(Adst)+
  201.     addq.l    #1,Adst
  202. @@:
  203.     PRECONV_EQUAL_LQ    1
  204.     LOOP_PRECONV_BUFFER    1
  205.     PRECONV_EXIT_EQUAL_LQ    1
  206.     move.l    Adst,-(sp)        ;leftのdstの末尾+2
  207.     START_PRECONV_BUFFER    2
  208.     addq.l    #1,Adst            ;dst
  209.     move.w    preconv_rest_2,Dtmp
  210.     bpl    @f
  211.     move.b    Dtmp,(Adst)+
  212.     addq.l    #1,Adst
  213. @@:
  214.     PRECONV_EQUAL_LQ    2
  215.     LOOP_PRECONV_BUFFER    2
  216.     PRECONV_EXIT_EQUAL_LQ    2
  217.     subq.l    #1,Adst            ;rightのdstの末尾+1=dstの末尾+1
  218.     lea.l    preconv_rest_1,a3
  219.     cmpa.l    (sp)+,Adst        ;(rightのdstの末尾+1)-(leftのdstの末尾+2)
  220.     blo    1f            ;leftが長い
  221.     bhi    2f            ;rightが長い
  222.     sf.b    (a3)+            ;left繰り越しなし
  223.     sf.b    (1,a3)            ;right繰り越しなし
  224.     bra    @done
  225. 1:    st.b    (a3)+            ;left繰り越しあり
  226.     move.b    (Adst),(a3)+        ;left繰り越しデータ
  227.     sf.b    (a3)            ;right繰り越しなし
  228.     bra    @done
  229. 2:    sf.b    (a3)+            ;left繰り越しなし
  230.     addq.l    #1,a3
  231.     st.b    (a3)+            ;right繰り越しあり
  232.     move.b    -(Adst),(a3)        ;right繰り越しデータ
  233.     subq.l    #1,Adst
  234.     bra    @done
  235.  
  236. ;間隔が縮む→周波数が上がる
  237. @up:
  238.     START_PRECONV_BUFFER    1
  239.     move.w    preconv_rest_1,Dtmp
  240.     bpl    @f
  241.     move.b    Dtmp,(Adst)+
  242.     addq.l    #1,Adst
  243. @@:
  244.     PRECONV_UP_LQ    1
  245.     LOOP_PRECONV_BUFFER    1
  246.     PRECONV_EXIT_UP_LQ    1
  247.     move.l    Adst,-(sp)        ;leftのdstの末尾+2
  248.     START_PRECONV_BUFFER    2
  249.     addq.l    #1,Adst            ;dst
  250.     move.w    preconv_rest_2,Dtmp
  251.     bpl    @f
  252.     move.b    Dtmp,(Adst)+
  253.     addq.l    #1,Adst
  254. @@:
  255.     PRECONV_UP_LQ    2
  256.     LOOP_PRECONV_BUFFER    2
  257.     PRECONV_EXIT_UP_LQ    2
  258.     subq.l    #1,Adst            ;rightのdstの末尾+1=dstの末尾+1
  259.     lea.l    preconv_rest_1,a3
  260.     cmpa.l    (sp)+,Adst        ;(rightのdstの末尾+1)-(leftのdstの末尾+2)
  261.     blo    1f            ;leftが長い
  262.     bhi    2f            ;rightが長い
  263.     sf.b    (a3)+            ;left繰り越しなし
  264.     sf.b    (1,a3)            ;right繰り越しなし
  265.     bra    @done
  266. 1:    st.b    (a3)+            ;left繰り越しあり
  267.     move.b    (Adst),(a3)+        ;left繰り越しデータ
  268.     sf.b    (a3)            ;right繰り越しなし
  269.     bra    @done
  270. 2:    sf.b    (a3)+            ;left繰り越しなし
  271.     addq.l    #1,a3
  272.     st.b    (a3)+            ;right繰り越しあり
  273.     move.b    -(Adst),(a3)        ;right繰り越しデータ
  274.     subq.l    #1,Adst
  275.     bra    @done
  276.  
  277. ;間隔が伸びる→周波数が下がる
  278. @down:
  279.     START_PRECONV_BUFFER    1
  280.     move.w    preconv_rest_1,Dtmp
  281.     bpl    @f
  282.     move.b    Dtmp,(Adst)+
  283.     addq.l    #1,Adst
  284. @@:
  285.     PRECONV_DOWN_LQ    1
  286.     LOOP_PRECONV_BUFFER    1
  287.     PRECONV_EXIT_DOWN_LQ    1
  288.     move.l    Adst,-(sp)        ;leftのdstの末尾+2
  289.     START_PRECONV_BUFFER    2
  290.     addq.l    #1,Adst            ;dst
  291.     move.w    preconv_rest_2,Dtmp
  292.     bpl    @f
  293.     move.b    Dtmp,(Adst)+
  294.     addq.l    #1,Adst
  295. @@:
  296.     PRECONV_DOWN_LQ    2
  297.     LOOP_PRECONV_BUFFER    2
  298.     PRECONV_EXIT_DOWN_LQ    2
  299.     subq.l    #1,Adst            ;rightのdstの末尾+1=dstの末尾+1
  300.     lea.l    preconv_rest_1,a3
  301.     cmpa.l    (sp)+,Adst        ;(rightのdstの末尾+1)-(leftのdstの末尾+2)
  302.     blo    1f            ;leftが長い
  303.     bhi    2f            ;rightが長い
  304.     sf.b    (a3)+            ;left繰り越しなし
  305.     sf.b    (1,a3)            ;right繰り越しなし
  306.     bra    @done
  307. 1:    st.b    (a3)+            ;left繰り越しあり
  308.     move.b    (Adst),(a3)+        ;left繰り越しデータ
  309.     sf.b    (a3)            ;right繰り越しなし
  310.     bra    @done
  311. 2:    sf.b    (a3)+            ;left繰り越しなし
  312.     addq.l    #1,a3
  313.     st.b    (a3)+            ;right繰り越しあり
  314.     move.b    -(Adst),(a3)        ;right繰り越しデータ
  315.     subq.l    #1,Adst
  316.     bra    @done
  317.  
  318. @done:
  319.     .endm
  320.  
  321. ;----------------------------------------------------------------
  322. ;ステレオ<High Quality>
  323. PRECONV_STEREO_HQ    .macro
  324.     lea.l    pcm2tl_table+32768,Atbl
  325.     cmpi.l    #65536,speed_rate
  326.     bhi    @down            ;間隔が伸びる→周波数が下がる
  327. ;間隔が同じ→周波数が同じ
  328. ;間隔が縮む→周波数が上がる
  329. @up:
  330.     START_PRECONV_BUFFER    1
  331.     move.w    preconv_rest_1,Dtmp
  332.     bpl    @f
  333.     move.b    Dtmp,(Adst)+
  334.     addq.l    #1,Adst
  335. @@:
  336.     PRECONV_UP_HQ    1
  337.     LOOP_PRECONV_BUFFER    1
  338.     PRECONV_EXIT_UP_HQ    1
  339.     move.l    Adst,-(sp)        ;leftのdstの末尾+2
  340.     START_PRECONV_BUFFER    2
  341.     addq.l    #1,Adst            ;dst
  342.     move.w    preconv_rest_2,Dtmp
  343.     bpl    @f
  344.     move.b    Dtmp,(Adst)+
  345.     addq.l    #1,Adst
  346. @@:
  347.     PRECONV_UP_HQ    2
  348.     LOOP_PRECONV_BUFFER    2
  349.     PRECONV_EXIT_UP_HQ    2
  350.     subq.l    #1,Adst            ;rightのdstの末尾+1=dstの末尾+1
  351.     lea.l    preconv_rest_1,a3
  352.     cmpa.l    (sp)+,Adst        ;(rightのdstの末尾+1)-(leftのdstの末尾+2)
  353.     blo    1f            ;leftが長い
  354.     bhi    2f            ;rightが長い
  355.     sf.b    (a3)+            ;left繰り越しなし
  356.     sf.b    (1,a3)            ;right繰り越しなし
  357.     bra    @done
  358. 1:    st.b    (a3)+            ;left繰り越しあり
  359.     move.b    (Adst),(a3)+        ;left繰り越しデータ
  360.     sf.b    (a3)            ;right繰り越しなし
  361.     bra    @done
  362. 2:    sf.b    (a3)+            ;left繰り越しなし
  363.     addq.l    #1,a3
  364.     st.b    (a3)+            ;right繰り越しあり
  365.     move.b    -(Adst),(a3)        ;right繰り越しデータ
  366.     subq.l    #1,Adst
  367.     bra    @done
  368.  
  369. ;間隔が伸びる→周波数が下がる
  370. @down:
  371.     START_PRECONV_BUFFER    1
  372.     move.w    preconv_rest_1,Dtmp
  373.     bpl    @f
  374.     move.b    Dtmp,(Adst)+
  375.     addq.l    #1,Adst
  376. @@:
  377.     PRECONV_DOWN_HQ    1
  378.     LOOP_PRECONV_BUFFER    1
  379.     PRECONV_EXIT_DOWN_HQ    1
  380.     move.l    Adst,-(sp)        ;leftのdstの末尾+2
  381.     START_PRECONV_BUFFER    2
  382.     addq.l    #1,Adst            ;dst
  383.     move.w    preconv_rest_2,Dtmp
  384.     bpl    @f
  385.     move.b    Dtmp,(Adst)+
  386.     addq.l    #1,Adst
  387. @@:
  388.     PRECONV_DOWN_HQ    2
  389.     LOOP_PRECONV_BUFFER    2
  390.     PRECONV_EXIT_DOWN_HQ    2
  391.     subq.l    #1,Adst            ;rightのdstの末尾+1=dstの末尾+1
  392.     lea.l    preconv_rest_1,a3
  393.     cmpa.l    (sp)+,Adst        ;(rightのdstの末尾+1)-(leftのdstの末尾+2)
  394.     blo    1f            ;leftが長い
  395.     bhi    2f            ;rightが長い
  396.     sf.b    (a3)+            ;left繰り越しなし
  397.     sf.b    (1,a3)            ;right繰り越しなし
  398.     bra    @done
  399. 1:    st.b    (a3)+            ;left繰り越しあり
  400.     move.b    (Adst),(a3)+        ;left繰り越しデータ
  401.     sf.b    (a3)            ;right繰り越しなし
  402.     bra    @done
  403. 2:    sf.b    (a3)+            ;left繰り越しなし
  404.     addq.l    #1,a3
  405.     st.b    (a3)+            ;right繰り越しあり
  406.     move.b    -(Adst),(a3)        ;right繰り越しデータ
  407.     subq.l    #1,Adst
  408.     bra    @done
  409.  
  410. @done:
  411.     .endm
  412.  
  413. ;----------------------------------------------------------------
  414. ;ステレオ<Super Quality>
  415. PRECONV_STEREO_SQ    .macro
  416.     lea.l    pcm2tl_table+32768,Atbl
  417.     cmpi.l    #65536,speed_rate
  418.     bhi    @down            ;間隔が伸びる→周波数が下がる
  419. ;間隔が同じ→周波数が同じ
  420. ;間隔が縮む→周波数が上がる
  421. @up:
  422.     START_PRECONV_BUFFER    1
  423.     move.w    preconv_rest_1,Dtmp
  424.     bpl    @f
  425.     move.b    Dtmp,(Adst)+
  426.     addq.l    #1,Adst
  427. @@:
  428.     PRECONV_UP_SQ    1
  429.     LOOP_PRECONV_BUFFER    1
  430.     PRECONV_EXIT_UP_SQ    1
  431.     move.l    Adst,-(sp)        ;leftのdstの末尾+2
  432.     START_PRECONV_BUFFER    2
  433.     addq.l    #1,Adst            ;dst
  434.     move.w    preconv_rest_2,Dtmp
  435.     bpl    @f
  436.     move.b    Dtmp,(Adst)+
  437.     addq.l    #1,Adst
  438. @@:
  439.     PRECONV_UP_SQ    2
  440.     LOOP_PRECONV_BUFFER    2
  441.     PRECONV_EXIT_UP_SQ    2
  442.     subq.l    #1,Adst            ;rightのdstの末尾+1=dstの末尾+1
  443.     lea.l    preconv_rest_1,a3
  444.     cmpa.l    (sp)+,Adst        ;(rightのdstの末尾+1)-(leftのdstの末尾+2)
  445.     blo    1f            ;leftが長い
  446.     bhi    2f            ;rightが長い
  447.     sf.b    (a3)+            ;left繰り越しなし
  448.     sf.b    (1,a3)            ;right繰り越しなし
  449.     bra    @done
  450. 1:    st.b    (a3)+            ;left繰り越しあり
  451.     move.b    (Adst),(a3)+        ;left繰り越しデータ
  452.     sf.b    (a3)            ;right繰り越しなし
  453.     bra    @done
  454. 2:    sf.b    (a3)+            ;left繰り越しなし
  455.     addq.l    #1,a3
  456.     st.b    (a3)+            ;right繰り越しあり
  457.     move.b    -(Adst),(a3)        ;right繰り越しデータ
  458.     subq.l    #1,Adst
  459.     bra    @done
  460.  
  461. ;間隔が伸びる→周波数が下がる
  462. @down:
  463.     START_PRECONV_BUFFER    1
  464.     move.w    preconv_rest_1,Dtmp
  465.     bpl    @f
  466.     move.b    Dtmp,(Adst)+
  467.     addq.l    #1,Adst
  468. @@:
  469.     PRECONV_DOWN_SQ    1
  470.     LOOP_PRECONV_BUFFER    1
  471.     PRECONV_EXIT_DOWN_SQ    1
  472.     move.l    Adst,-(sp)        ;leftのdstの末尾+2
  473.     START_PRECONV_BUFFER    2
  474.     addq.l    #1,Adst            ;dst
  475.     move.w    preconv_rest_2,Dtmp
  476.     bpl    @f
  477.     move.b    Dtmp,(Adst)+
  478.     addq.l    #1,Adst
  479. @@:
  480.     PRECONV_DOWN_SQ    2
  481.     LOOP_PRECONV_BUFFER    2
  482.     PRECONV_EXIT_DOWN_SQ    2
  483.     subq.l    #1,Adst            ;rightのdstの末尾+1=dstの末尾+1
  484.     lea.l    preconv_rest_1,a3
  485.     cmpa.l    (sp)+,Adst        ;(rightのdstの末尾+1)-(leftのdstの末尾+2)
  486.     blo    1f            ;leftが長い
  487.     bhi    2f            ;rightが長い
  488.     sf.b    (a3)+            ;left繰り越しなし
  489.     sf.b    (1,a3)            ;right繰り越しなし
  490.     bra    @done
  491. 1:    st.b    (a3)+            ;left繰り越しあり
  492.     move.b    (Adst),(a3)+        ;left繰り越しデータ
  493.     sf.b    (a3)            ;right繰り越しなし
  494.     bra    @done
  495. 2:    sf.b    (a3)+            ;left繰り越しなし
  496.     addq.l    #1,a3
  497.     st.b    (a3)+            ;right繰り越しあり
  498.     move.b    -(Adst),(a3)        ;right繰り越しデータ
  499.     subq.l    #1,Adst
  500.     bra    @done
  501.  
  502. @done:
  503.     .endm
  504.  
  505. ;----------------------------------------------------------------
  506. ;----------------------------------------------------------------
  507. ;<Low Quality>
  508. ;間隔が同じ→周波数が同じ
  509. ;    side    0=Mono,1=StereoLeft,2=StereoRight
  510. ;Ddat    dn
  511. ;Rpre    dn/an
  512. ;Dtmp    dn
  513. ;Atbl    an
  514. ;Asrc    an
  515. ;Adst    an
  516. ;Ajmp    an
  517. ;Alim    dn/an
  518. PRECONV_EQUAL_LQ    .macro    side
  519.     move.w    preconv_pre_&side,Rpre
  520.     move.l    preconv_jmp_&side,Ajmp
  521.     move.l    Ajmp,Dtmp
  522.     beq    @spp
  523.     jmp    (Ajmp)
  524.  
  525. @npp:    move.b    #$7F,(Adst)+
  526.     if side,<addq.l #1,Adst>
  527.     bra    @vpp
  528. @dpp:    move.b    (Atbl,Rpre.w),(Adst)+
  529.     if side,<addq.l #1,Adst>
  530. @vpp:    move.w    Ddat,Rpre
  531.     cmp.l    Alim,Asrc
  532.     bhs    @epp
  533. @spp:    GET_DATA_&side    Asrc,Ddat,Dtmp
  534.     bgt    @dpp
  535.     beq    @dpm
  536.     move.w    Ddat,Dtmp
  537.     add.w    Rpre,Dtmp
  538.     blt    @xmm
  539. @dpm:    move.b    (Atbl,Rpre.w),(Adst)+
  540.     if side,<addq.l #1,Adst>
  541. @vpm:    move.w    Ddat,Rpre
  542.     cmp.l    Alim,Asrc
  543.     bhs    @epm
  544. @spm:    GET_DATA_&side    Asrc,Ddat,Dtmp
  545.     bgt    @npp
  546.     beq    @npz
  547. @xmm:    st.b    (Adst)+
  548.     if side,<addq.l #1,Adst>
  549.     bra    @vmm
  550. @npz:    move.b    #$7F,(Adst)+
  551.     if side,<addq.l #1,Adst>
  552.     bra    @vpm
  553.  
  554. @nmm:    move.b    #$7F,(Adst)+
  555.     if side,<addq.l #1,Adst>
  556.     bra    @vmm
  557. @dmm:    move.b    (Atbl,Rpre.w),(Adst)+
  558.     if side,<addq.l #1,Adst>
  559. @vmm:    move.w    Ddat,Rpre
  560.     cmp.l    Alim,Asrc
  561.     bhs    @emm
  562. @smm:    GET_DATA_&side    Asrc,Ddat,Dtmp
  563.     blt    @dmm
  564.     beq    @dmp
  565.     move.w    Ddat,Dtmp
  566.     add.w    Rpre,Dtmp
  567.     bgt    @xpp
  568. @dmp:    move.b    (Atbl,Rpre.w),(Adst)+
  569.     if side,<addq.l #1,Adst>
  570. @vmp:    move.w    Ddat,Rpre
  571.     cmp.l    Alim,Asrc
  572.     bhs    @emp
  573. @smp:    GET_DATA_&side    Asrc,Ddat,Dtmp
  574.     blt    @nmm
  575.     beq    @nmz
  576. @xpp:    st.b    (Adst)+
  577.     if side,<addq.l #1,Adst>
  578.     bra    @vpp
  579. @nmz:    move.b    #$7F,(Adst)+
  580.     if side,<addq.l #1,Adst>
  581.     bra    @vmp
  582.  
  583. @epp:    lea.l    (@spp,pc),Ajmp
  584.     bra    @done
  585.  
  586. @epm:    lea.l    (@spm,pc),Ajmp
  587.     bra    @done
  588.  
  589. @emm:    lea.l    (@smm,pc),Ajmp
  590.     bra    @done
  591.  
  592. @emp:    lea.l    (@smp,pc),Ajmp
  593.     bra    @done
  594.  
  595. @done:
  596.     .endm
  597. PRECONV_EXIT_EQUAL_LQ    .macro    side
  598.     move.l    Ajmp,preconv_jmp_&side
  599.     move.w    Rpre,preconv_pre_&side
  600.     .endm
  601.  
  602. ;----------------------------------------------------------------
  603. ;<Low Quality>
  604. ;間隔が縮む→周波数が上がる
  605. ;    side    0=Mono,1=StereoLeft,2=StereoRight
  606. ;Ddat    dn
  607. ;Rpre    dn/an
  608. ;Dtmp    dn
  609. ;Dscnt    dn
  610. ;Atbl    an
  611. ;Asrc    an
  612. ;Adst    an
  613. ;Ajmp    an
  614. ;Rsrat    dn/an
  615. ;Alim    dn/an
  616. PRECONV_UP_LQ    .macro    side
  617.     move.w    preconv_scnt_&side+2,Dscnt
  618.     move.w    preconv_pre_&side,Rpre
  619.     move.l    preconv_jmp_&side,Ajmp
  620.     move.w    speed_rate+2,Rsrat
  621.     move.l    Ajmp,Dtmp
  622.     beq    @spp
  623.     jmp    (Ajmp)
  624.  
  625. @npp:    move.b    #$7F,(Adst)+
  626.     if side,<addq.l #1,Adst>
  627.     bra    @vpp
  628. @dpp:    move.b    (Atbl,Rpre.w),(Adst)+
  629.     if side,<addq.l #1,Adst>
  630. @vpp:    add.w    Rsrat,Dscnt
  631.     bcc    10f
  632.     move.w    Ddat,Rpre
  633.     cmp.l    Alim,Asrc
  634.     bhs    @epp
  635. @spp:    GET_DATA_&side    Asrc,Ddat,Dtmp
  636. 10:    tst.w    Ddat
  637.     bgt    @dpp
  638.     beq    @dpm
  639.     move.w    Ddat,Dtmp
  640.     add.w    Rpre,Dtmp
  641.     blt    @xmm
  642. @dpm:    move.b    (Atbl,Rpre.w),(Adst)+
  643.     if side,<addq.l #1,Adst>
  644. @vpm:    add.w    Rsrat,Dscnt
  645.     bcc    10f
  646.     move.w    Ddat,Rpre
  647.     cmp.l    Alim,Asrc
  648.     bhs    @epm
  649. @spm:    GET_DATA_&side    Asrc,Ddat,Dtmp
  650. 10:    tst.w    Ddat
  651.     bgt    @npp
  652.     beq    @npz
  653. @xmm:    st.b    (Adst)+
  654.     if side,<addq.l #1,Adst>
  655.     bra    @vmm
  656. @npz:    move.b    #$7F,(Adst)+
  657.     if side,<addq.l #1,Adst>
  658.     bra    @vpm
  659.  
  660. @nmm:    move.b    #$7F,(Adst)+
  661.     if side,<addq.l #1,Adst>
  662.     bra    @vmm
  663. @dmm:    move.b    (Atbl,Rpre.w),(Adst)+
  664.     if side,<addq.l #1,Adst>
  665. @vmm:    add.w    Rsrat,Dscnt
  666.     bcc    10f
  667.     move.w    Ddat,Rpre
  668.     cmp.l    Alim,Asrc
  669.     bhs    @emm
  670. @smm:    GET_DATA_&side    Asrc,Ddat,Dtmp
  671. 10:    tst.w    Ddat
  672.     blt    @dmm
  673.     beq    @dmp
  674.     move.w    Ddat,Dtmp
  675.     add.w    Rpre,Dtmp
  676.     bgt    @xpp
  677. @dmp:    move.b    (Atbl,Rpre.w),(Adst)+
  678.     if side,<addq.l #1,Adst>
  679. @vmp:    add.w    Rsrat,Dscnt
  680.     bcc    10f
  681.     move.w    Ddat,Rpre
  682.     cmp.l    Alim,Asrc
  683.     bhs    @emp
  684. @smp:    GET_DATA_&side    Asrc,Ddat,Dtmp
  685. 10:    tst.w    Ddat
  686.     blt    @nmm
  687.     beq    @nmz
  688. @xpp:    st.b    (Adst)+
  689.     if side,<addq.l #1,Adst>
  690.     bra    @vpp
  691. @nmz:    move.b    #$7F,(Adst)+
  692.     if side,<addq.l #1,Adst>
  693.     bra    @vmp
  694.  
  695. @epp:    lea.l    (@spp,pc),Ajmp
  696.     bra    @done
  697.  
  698. @epm:    lea.l    (@spm,pc),Ajmp
  699.     bra    @done
  700.  
  701. @emm:    lea.l    (@smm,pc),Ajmp
  702.     bra    @done
  703.  
  704. @emp:    lea.l    (@smp,pc),Ajmp
  705.     bra    @done
  706.  
  707. @done:
  708.     .endm
  709. PRECONV_EXIT_UP_LQ    .macro    side
  710.     move.l    Ajmp,preconv_jmp_&side
  711.     move.w    Rpre,preconv_pre_&side
  712.     move.w    Dscnt,preconv_scnt_&side+2
  713.     .endm
  714.  
  715. ;----------------------------------------------------------------
  716. ;<Low Quality>
  717. ;間隔が伸びる→周波数が下がる
  718. ;    side    0=Mono,1=StereoLeft,2=StereoRight
  719. ;Ddat    dn
  720. ;Rpre    dn/an
  721. ;Dtmp    dn
  722. ;Dscnt    dn
  723. ;Atbl    an
  724. ;Asrc    an
  725. ;Adst    an
  726. ;Ajmp    an
  727. ;Rsone    dn/an    const
  728. ;Rsrat    dn/an
  729. ;Alim    dn/an
  730. PRECONV_DOWN_LQ    .macro    side
  731.     move.l    preconv_scnt_&side,Dscnt
  732.     move.w    preconv_pre_&side,Rpre
  733.     move.l    preconv_jmp_&side,Ajmp
  734.     move.l    speed_rate,Rsrat
  735.     move.l    #65536,Rsone
  736.     move.l    Ajmp,Dtmp
  737.     beq    @spp
  738.     jmp    (Ajmp)
  739.  
  740. @npp:    move.b    #$7F,(Adst)+
  741.     if side,<addq.l #1,Adst>
  742.     bra    @vpp
  743. @dpp:    move.b    (Atbl,Rpre.w),(Adst)+
  744.     if side,<addq.l #1,Adst>
  745. @vpp:    move.w    Ddat,Rpre
  746. 10:    cmp.l    Alim,Asrc
  747.     bhs    @epp
  748. @spp:    GET_DATA_&side    Asrc,Ddat,Dtmp
  749.     sub.l    Rsone,Dscnt
  750.     bpl    10b
  751.     add.l    Rsrat,Dscnt
  752.     tst.w    Ddat
  753.     bgt    @dpp
  754.     beq    @dpm
  755.     move.w    Ddat,Dtmp
  756.     add.w    Rpre,Dtmp
  757.     blt    @xmm
  758. @dpm:    move.b    (Atbl,Rpre.w),(Adst)+
  759.     if side,<addq.l #1,Adst>
  760. @vpm:    move.w    Ddat,Rpre
  761. 10:    cmp.l    Alim,Asrc
  762.     bhs    @epm
  763. @spm:    GET_DATA_&side    Asrc,Ddat,Dtmp
  764.     sub.l    Rsone,Dscnt
  765.     bpl    10b
  766.     add.l    Rsrat,Dscnt
  767.     tst.w    Ddat
  768.     bgt    @npp
  769.     beq    @npz
  770. @xmm:    st.b    (Adst)+
  771.     if side,<addq.l #1,Adst>
  772.     bra    @vmm
  773. @npz:    move.b    #$7F,(Adst)+
  774.     if side,<addq.l #1,Adst>
  775.     bra    @vpm
  776.  
  777. @nmm:    move.b    #$7F,(Adst)+
  778.     if side,<addq.l #1,Adst>
  779.     bra    @vmm
  780. @dmm:    move.b    (Atbl,Rpre.w),(Adst)+
  781.     if side,<addq.l #1,Adst>
  782. @vmm:    move.w    Ddat,Rpre
  783. 10:    cmp.l    Alim,Asrc
  784.     bhs    @emm
  785. @smm:    GET_DATA_&side    Asrc,Ddat,Dtmp
  786.     sub.l    Rsone,Dscnt
  787.     bpl    10b
  788.     add.l    Rsrat,Dscnt
  789.     tst.w    Ddat
  790.     blt    @dmm
  791.     beq    @dmp
  792.     move.w    Ddat,Dtmp
  793.     add.w    Rpre,Dtmp
  794.     bgt    @xpp
  795. @dmp:    move.b    (Atbl,Rpre.w),(Adst)+
  796.     if side,<addq.l #1,Adst>
  797. @vmp:    move.w    Ddat,Rpre
  798. 10:    cmp.l    Alim,Asrc
  799.     bhs    @emp
  800. @smp:    GET_DATA_&side    Asrc,Ddat,Dtmp
  801.     sub.l    Rsone,Dscnt
  802.     bpl    10b
  803.     add.l    Rsrat,Dscnt
  804.     tst.w    Ddat
  805.     blt    @nmm
  806.     beq    @nmz
  807. @xpp:    st.b    (Adst)+
  808.     if side,<addq.l #1,Adst>
  809.     bra    @vpp
  810. @nmz:    move.b    #$7F,(Adst)+
  811.     if side,<addq.l #1,Adst>
  812.     bra    @vmp
  813.  
  814. @epp:    lea.l    (@spp,pc),Ajmp
  815.     bra    @done
  816.  
  817. @epm:    lea.l    (@spm,pc),Ajmp
  818.     bra    @done
  819.  
  820. @emm:    lea.l    (@smm,pc),Ajmp
  821.     bra    @done
  822.  
  823. @emp:    lea.l    (@smp,pc),Ajmp
  824.     bra    @done
  825.  
  826. @done:
  827.     .endm
  828. PRECONV_EXIT_DOWN_LQ    .macro    side
  829.     move.l    Ajmp,preconv_jmp_&side
  830.     move.w    Rpre,preconv_pre_&side
  831.     move.l    Dscnt,preconv_scnt_&side
  832.     .endm
  833.  
  834. ;----------------------------------------------------------------
  835. ;----------------------------------------------------------------
  836. ;<High Quality>
  837. ;間隔が縮む→周波数が上がる
  838. ;    side    0=Mono,1=StereoLeft,2=StereoRight
  839. ;Ddat    dn
  840. ;Dfor    dn
  841. ;Rpre    dn/an
  842. ;Rbak    dn/an
  843. ;Dtmp    dn
  844. ;Dscnt    dn
  845. ;Atbl    an
  846. ;Asrc    an
  847. ;Adst    an
  848. ;Ajmp    an
  849. ;Rsrat    dn/an
  850. ;Alim    dn/an
  851. PRECONV_UP_HQ    .macro    side
  852.     move.w    preconv_for_&side,Dfor
  853.     move.w    preconv_bak_&side,Rbak
  854.     move.w    preconv_scnt_&side+2,Dscnt
  855.     move.w    preconv_pre_&side,Rpre
  856.     move.l    preconv_jmp_&side,Ajmp
  857.     move.w    speed_rate+2,Rsrat
  858.     move.l    Ajmp,Dtmp
  859.     beq    @spp
  860.     jmp    (Ajmp)
  861.  
  862. @npp:    move.b    #$7F,(Adst)+
  863.     if side,<addq.l #1,Adst>
  864.     bra    @vpp
  865. @dpp:    move.b    (Atbl,Rpre.w),(Adst)+
  866.     if side,<addq.l #1,Adst>
  867. @vpp:    move.w    Ddat,Rpre
  868.     add.w    Rsrat,Dscnt
  869.     bcc    10f
  870.     move.w    Dfor,Rbak
  871.     cmp.l    Alim,Asrc
  872.     bhs    @epp
  873. @spp:    GET_DATA_&side    Asrc,Dfor,Dtmp
  874.     add.w    #$8000,Dfor
  875. 10:    move.w    Dfor,Ddat        ;Dfor>=Rbak        Dfor<Rbak
  876.     sub.w    Rbak,Ddat        ;Dfor-Rbak        Dfor-Rbak+65536
  877.     subx.w    Dtmp,Dtmp        ;0            -1
  878.     mulu.w    Dscnt,Ddat        ;(Dfor-Rbak)*RATE*65536    (Dfor-Rbak+65536)*RATE*65536
  879.     and.w    Dscnt,Dtmp        ;0            RATE*65536
  880.     swap.w    Ddat            ;(Dfor-Rbak)*RATE    (Dfor-Rbak+65536)*RATE
  881.     sub.w    Dtmp,Ddat        ;(Dfor-Rbak)*RATE    (Dfor-Rbak)*RATE
  882.     add.w    Rbak,Ddat        ;Rbak+(Dfor-Rbak)*RATE    Rbak+(Dfor-Rbak)*RATE
  883.     sub.w    #$8000,Ddat
  884.     bhi    @dpp
  885.     beq    @dpm
  886.     move.w    Ddat,Dtmp
  887.     add.w    Rpre,Dtmp
  888.     blt    @xmm
  889. @dpm:    move.b    (Atbl,Rpre.w),(Adst)+
  890.     if side,<addq.l #1,Adst>
  891. @vpm:    move.w    Ddat,Rpre
  892.     add.w    Rsrat,Dscnt
  893.     bcc    10f
  894.     move.w    Dfor,Rbak
  895.     cmp.l    Alim,Asrc
  896.     bhs    @epm
  897. @spm:    GET_DATA_&side    Asrc,Dfor,Dtmp
  898.     add.w    #$8000,Dfor
  899. 10:    move.w    Dfor,Ddat        ;Dfor>=Rbak        Dfor<Rbak
  900.     sub.w    Rbak,Ddat        ;Dfor-Rbak        Dfor-Rbak+65536
  901.     subx.w    Dtmp,Dtmp        ;0            -1
  902.     mulu.w    Dscnt,Ddat        ;(Dfor-Rbak)*RATE*65536    (Dfor-Rbak+65536)*RATE*65536
  903.     and.w    Dscnt,Dtmp        ;0            RATE*65536
  904.     swap.w    Ddat            ;(Dfor-Rbak)*RATE    (Dfor-Rbak+65536)*RATE
  905.     sub.w    Dtmp,Ddat        ;(Dfor-Rbak)*RATE    (Dfor-Rbak)*RATE
  906.     add.w    Rbak,Ddat        ;Rbak+(Dfor-Rbak)*RATE    Rbak+(Dfor-Rbak)*RATE
  907.     sub.w    #$8000,Ddat
  908.     bhi    @npp
  909.     beq    @npz
  910. @xmm:    st.b    (Adst)+
  911.     if side,<addq.l #1,Adst>
  912.     bra    @vmm
  913. @npz:    move.b    #$7F,(Adst)+
  914.     if side,<addq.l #1,Adst>
  915.     bra    @vpm
  916.  
  917. @nmm:    move.b    #$7F,(Adst)+
  918.     if side,<addq.l #1,Adst>
  919.     bra    @vmm
  920. @dmm:    move.b    (Atbl,Rpre.w),(Adst)+
  921.     if side,<addq.l #1,Adst>
  922. @vmm:    move.w    Ddat,Rpre
  923.     add.w    Rsrat,Dscnt
  924.     bcc    10f
  925.     move.w    Dfor,Rbak
  926.     cmp.l    Alim,Asrc
  927.     bhs    @emm
  928. @smm:    GET_DATA_&side    Asrc,Dfor,Dtmp
  929.     add.w    #$8000,Dfor
  930. 10:    move.w    Dfor,Ddat        ;Dfor>=Rbak        Dfor<Rbak
  931.     sub.w    Rbak,Ddat        ;Dfor-Rbak        Dfor-Rbak+65536
  932.     subx.w    Dtmp,Dtmp        ;0            -1
  933.     mulu.w    Dscnt,Ddat        ;(Dfor-Rbak)*RATE*65536    (Dfor-Rbak+65536)*RATE*65536
  934.     and.w    Dscnt,Dtmp        ;0            RATE*65536
  935.     swap.w    Ddat            ;(Dfor-Rbak)*RATE    (Dfor-Rbak+65536)*RATE
  936.     sub.w    Dtmp,Ddat        ;(Dfor-Rbak)*RATE    (Dfor-Rbak)*RATE
  937.     add.w    Rbak,Ddat        ;Rbak+(Dfor-Rbak)*RATE    Rbak+(Dfor-Rbak)*RATE
  938.     sub.w    #$8000,Ddat
  939.     blo    @dmm
  940.     beq    @dmp
  941.     move.w    Ddat,Dtmp
  942.     add.w    Rpre,Dtmp
  943.     bgt    @xpp
  944. @dmp:    move.b    (Atbl,Rpre.w),(Adst)+
  945.     if side,<addq.l #1,Adst>
  946. @vmp:    move.w    Ddat,Rpre
  947.     add.w    Rsrat,Dscnt
  948.     bcc    10f
  949.     move.w    Dfor,Rbak
  950.     cmp.l    Alim,Asrc
  951.     bhs    @emp
  952. @smp:    GET_DATA_&side    Asrc,Dfor,Dtmp
  953.     add.w    #$8000,Dfor
  954. 10:    move.w    Dfor,Ddat        ;Dfor>=Rbak        Dfor<Rbak
  955.     sub.w    Rbak,Ddat        ;Dfor-Rbak        Dfor-Rbak+65536
  956.     subx.w    Dtmp,Dtmp        ;0            -1
  957.     mulu.w    Dscnt,Ddat        ;(Dfor-Rbak)*RATE*65536    (Dfor-Rbak+65536)*RATE*65536
  958.     and.w    Dscnt,Dtmp        ;0            RATE*65536
  959.     swap.w    Ddat            ;(Dfor-Rbak)*RATE    (Dfor-Rbak+65536)*RATE
  960.     sub.w    Dtmp,Ddat        ;(Dfor-Rbak)*RATE    (Dfor-Rbak)*RATE
  961.     add.w    Rbak,Ddat        ;Rbak+(Dfor-Rbak)*RATE    Rbak+(Dfor-Rbak)*RATE
  962.     sub.w    #$8000,Ddat
  963.     blo    @nmm
  964.     beq    @nmz
  965. @xpp:    st.b    (Adst)+
  966.     if side,<addq.l #1,Adst>
  967.     bra    @vpp
  968. @nmz:    move.b    #$7F,(Adst)+
  969.     if side,<addq.l #1,Adst>
  970.     bra    @vmp
  971.  
  972. @epp:    lea.l    (@spp,pc),Ajmp
  973.     bra    @done
  974.  
  975. @epm:    lea.l    (@spm,pc),Ajmp
  976.     bra    @done
  977.  
  978. @emm:    lea.l    (@smm,pc),Ajmp
  979.     bra    @done
  980.  
  981. @emp:    lea.l    (@smp,pc),Ajmp
  982.     bra    @done
  983.  
  984. @done:
  985.     .endm
  986. PRECONV_EXIT_UP_HQ    .macro    side
  987.     move.l    Ajmp,preconv_jmp_&side
  988.     move.w    Rpre,preconv_pre_&side
  989.     move.w    Dscnt,preconv_scnt_&side+2
  990.     move.w    Dfor,preconv_for_&side
  991.     move.w    Rbak,preconv_bak_&side
  992.     .endm
  993.  
  994. ;----------------------------------------------------------------
  995. ;<High Quality>
  996. ;間隔が伸びる→周波数が下がる
  997. ;    side    0=Mono,1=StereoLeft,2=StereoRight
  998. ;Ddat    dn
  999. ;Dfor    dn
  1000. ;Rpre    dn/an
  1001. ;Rbak    dn/an
  1002. ;Dtmp    dn
  1003. ;Dscnt    dn
  1004. ;Atbl    an
  1005. ;Asrc    an
  1006. ;Adst    an
  1007. ;Ajmp    an
  1008. ;Rsone    dn/an    const
  1009. ;Rsrat    dn/an
  1010. ;Alim    dn/an
  1011. PRECONV_DOWN_HQ    .macro    side
  1012.     move.w    preconv_for_&side,Dfor
  1013.     move.w    preconv_bak_&side,Rbak
  1014.     move.l    preconv_scnt_&side,Dscnt
  1015.     move.w    preconv_pre_&side,Rpre
  1016.     move.l    preconv_jmp_&side,Ajmp
  1017.     move.l    speed_rate,Rsrat
  1018.     move.l    #65536,Rsone
  1019.     move.l    Ajmp,Dtmp
  1020.     beq    @spp
  1021.     jmp    (Ajmp)
  1022.  
  1023. @npp:    move.b    #$7F,(Adst)+
  1024.     if side,<addq.l #1,Adst>
  1025.     bra    @vpp
  1026. @dpp:    move.b    (Atbl,Rpre.w),(Adst)+
  1027.     if side,<addq.l #1,Adst>
  1028. @vpp:    move.w    Ddat,Rpre
  1029. 10:    move.w    Dfor,Rbak
  1030.     cmp.l    Alim,Asrc
  1031.     bhs    @epp
  1032. @spp:    GET_DATA_&side    Asrc,Dfor,Dtmp
  1033.     add.w    #$8000,Dfor
  1034.     sub.l    Rsone,Dscnt
  1035.     bpl    10b
  1036.     add.l    Rsrat,Dscnt
  1037.     move.w    Dfor,Ddat        ;Dfor>=Rbak        Dfor<Rbak
  1038.     sub.w    Rbak,Ddat        ;Dfor-Rbak        Dfor-Rbak+65536
  1039.     subx.w    Dtmp,Dtmp        ;0            -1
  1040.     mulu.w    Dscnt,Ddat        ;(Dfor-Rbak)*RATE*65536    (Dfor-Rbak+65536)*RATE*65536
  1041.     and.w    Dscnt,Dtmp        ;0            RATE*65536
  1042.     swap.w    Ddat            ;(Dfor-Rbak)*RATE    (Dfor-Rbak+65536)*RATE
  1043.     sub.w    Dtmp,Ddat        ;(Dfor-Rbak)*RATE    (Dfor-Rbak)*RATE
  1044.     add.w    Rbak,Ddat        ;Rbak+(Dfor-Rbak)*RATE    Rbak+(Dfor-Rbak)*RATE
  1045.     sub.w    #$8000,Ddat
  1046.     bhi    @dpp
  1047.     beq    @dpm
  1048.     move.w    Ddat,Dtmp
  1049.     add.w    Rpre,Dtmp
  1050.     blt    @xmm
  1051. @dpm:    move.b    (Atbl,Rpre.w),(Adst)+
  1052.     if side,<addq.l #1,Adst>
  1053. @vpm:    move.w    Ddat,Rpre
  1054. 10:    move.w    Dfor,Rbak
  1055.     cmp.l    Alim,Asrc
  1056.     bhs    @epm
  1057. @spm:    GET_DATA_&side    Asrc,Dfor,Dtmp
  1058.     add.w    #$8000,Dfor
  1059.     sub.l    Rsone,Dscnt
  1060.     bpl    10b
  1061.     add.l    Rsrat,Dscnt
  1062.     move.w    Dfor,Ddat        ;Dfor>=Rbak        Dfor<Rbak
  1063.     sub.w    Rbak,Ddat        ;Dfor-Rbak        Dfor-Rbak+65536
  1064.     subx.w    Dtmp,Dtmp        ;0            -1
  1065.     mulu.w    Dscnt,Ddat        ;(Dfor-Rbak)*RATE*65536    (Dfor-Rbak+65536)*RATE*65536
  1066.     and.w    Dscnt,Dtmp        ;0            RATE*65536
  1067.     swap.w    Ddat            ;(Dfor-Rbak)*RATE    (Dfor-Rbak+65536)*RATE
  1068.     sub.w    Dtmp,Ddat        ;(Dfor-Rbak)*RATE    (Dfor-Rbak)*RATE
  1069.     add.w    Rbak,Ddat        ;Rbak+(Dfor-Rbak)*RATE    Rbak+(Dfor-Rbak)*RATE
  1070.     sub.w    #$8000,Ddat
  1071.     bhi    @npp
  1072.     beq    @npz
  1073. @xmm:    st.b    (Adst)+
  1074.     if side,<addq.l #1,Adst>
  1075.     bra    @vmm
  1076. @npz:    move.b    #$7F,(Adst)+
  1077.     if side,<addq.l #1,Adst>
  1078.     bra    @vpm
  1079.  
  1080. @nmm:    move.b    #$7F,(Adst)+
  1081.     if side,<addq.l #1,Adst>
  1082.     bra    @vmm
  1083. @dmm:    move.b    (Atbl,Rpre.w),(Adst)+
  1084.     if side,<addq.l #1,Adst>
  1085. @vmm:    move.w    Ddat,Rpre
  1086. 10:    move.w    Dfor,Rbak
  1087.     cmp.l    Alim,Asrc
  1088.     bhs    @emm
  1089. @smm:    GET_DATA_&side    Asrc,Dfor,Dtmp
  1090.     add.w    #$8000,Dfor
  1091.     sub.l    Rsone,Dscnt
  1092.     bpl    10b
  1093.     add.l    Rsrat,Dscnt
  1094.     move.w    Dfor,Ddat        ;Dfor>=Rbak        Dfor<Rbak
  1095.     sub.w    Rbak,Ddat        ;Dfor-Rbak        Dfor-Rbak+65536
  1096.     subx.w    Dtmp,Dtmp        ;0            -1
  1097.     mulu.w    Dscnt,Ddat        ;(Dfor-Rbak)*RATE*65536    (Dfor-Rbak+65536)*RATE*65536
  1098.     and.w    Dscnt,Dtmp        ;0            RATE*65536
  1099.     swap.w    Ddat            ;(Dfor-Rbak)*RATE    (Dfor-Rbak+65536)*RATE
  1100.     sub.w    Dtmp,Ddat        ;(Dfor-Rbak)*RATE    (Dfor-Rbak)*RATE
  1101.     add.w    Rbak,Ddat        ;Rbak+(Dfor-Rbak)*RATE    Rbak+(Dfor-Rbak)*RATE
  1102.     sub.w    #$8000,Ddat
  1103.     blo    @dmm
  1104.     beq    @dmp
  1105.     move.w    Ddat,Dtmp
  1106.     add.w    Rpre,Dtmp
  1107.     bgt    @xpp
  1108. @dmp:    move.b    (Atbl,Rpre.w),(Adst)+
  1109.     if side,<addq.l #1,Adst>
  1110. @vmp:    move.w    Ddat,Rpre
  1111. 10:    move.w    Dfor,Rbak
  1112.     cmp.l    Alim,Asrc
  1113.     bhs    @emp
  1114. @smp:    GET_DATA_&side    Asrc,Dfor,Dtmp
  1115.     add.w    #$8000,Dfor
  1116.     sub.l    Rsone,Dscnt
  1117.     bpl    10b
  1118.     add.l    Rsrat,Dscnt
  1119.     move.w    Dfor,Ddat        ;Dfor>=Rbak        Dfor<Rbak
  1120.     sub.w    Rbak,Ddat        ;Dfor-Rbak        Dfor-Rbak+65536
  1121.     subx.w    Dtmp,Dtmp        ;0            -1
  1122.     mulu.w    Dscnt,Ddat        ;(Dfor-Rbak)*RATE*65536    (Dfor-Rbak+65536)*RATE*65536
  1123.     and.w    Dscnt,Dtmp        ;0            RATE*65536
  1124.     swap.w    Ddat            ;(Dfor-Rbak)*RATE    (Dfor-Rbak+65536)*RATE
  1125.     sub.w    Dtmp,Ddat        ;(Dfor-Rbak)*RATE    (Dfor-Rbak)*RATE
  1126.     add.w    Rbak,Ddat        ;Rbak+(Dfor-Rbak)*RATE    Rbak+(Dfor-Rbak)*RATE
  1127.     sub.w    #$8000,Ddat
  1128.     blo    @nmm
  1129.     beq    @nmz
  1130. @xpp:    st.b    (Adst)+
  1131.     if side,<addq.l #1,Adst>
  1132.     bra    @vpp
  1133. @nmz:    move.b    #$7F,(Adst)+
  1134.     if side,<addq.l #1,Adst>
  1135.     bra    @vmp
  1136.  
  1137. @epp:    lea.l    (@spp,pc),Ajmp
  1138.     bra    @done
  1139.  
  1140. @epm:    lea.l    (@spm,pc),Ajmp
  1141.     bra    @done
  1142.  
  1143. @emm:    lea.l    (@smm,pc),Ajmp
  1144.     bra    @done
  1145.  
  1146. @emp:    lea.l    (@smp,pc),Ajmp
  1147.     bra    @done
  1148.  
  1149. @done:
  1150.     .endm
  1151. PRECONV_EXIT_DOWN_HQ    .macro    side
  1152.     move.l    Ajmp,preconv_jmp_&side
  1153.     move.w    Rpre,preconv_pre_&side
  1154.     move.l    Dscnt,preconv_scnt_&side
  1155.     move.w    Dfor,preconv_for_&side
  1156.     move.w    Rbak,preconv_bak_&side
  1157.     .endm
  1158.  
  1159. ;----------------------------------------------------------------
  1160. ;----------------------------------------------------------------
  1161. ;<Super Quality>
  1162. ;間隔が縮む→周波数が上がる
  1163. ;    side    0=Mono,1=StereoLeft,2=StereoRight
  1164. ;Ddat    dn
  1165. ;Dfor    dn
  1166. ;Rpre    dn/an
  1167. ;Rbak    dn/an
  1168. ;Dtmp    dn
  1169. ;Dscnt    dn
  1170. ;Dtop    dn    sq only
  1171. ;Atbl    an
  1172. ;Asrc    an
  1173. ;Adst    an
  1174. ;Ajmp    an
  1175. ;Rsrat    dn/an
  1176. ;Alim    dn/an
  1177. PRECONV_UP_SQ    .macro    side
  1178.     move.l    preconv_dat_&side,Ddat
  1179.     move.w    preconv_for_&side,Dfor
  1180.     move.w    preconv_bak_&side,Rbak
  1181.     move.w    preconv_scnt_&side+2,Dscnt
  1182.     move.w    preconv_pre_&side,Rpre
  1183.     move.l    preconv_jmp_&side,Ajmp
  1184.     move.w    speed_rate+2,Rsrat
  1185.     move.l    Ajmp,Dtmp
  1186.     beq    @spp
  1187.     jmp    (Ajmp)
  1188.  
  1189. @npp:    move.b    #$7F,(Adst)+
  1190.     if side,<addq.l #1,Adst>
  1191.     bra    @vpp
  1192. @dpp:    move.b    (Atbl,Rpre.w),(Adst)+
  1193.     if side,<addq.l #1,Adst>
  1194. @vpp:    move.w    Ddat,Rpre
  1195.     add.w    Rsrat,Dscnt
  1196.     bcs    11f
  1197. ;2区間にまたがらない
  1198.     move.w    Dtop,Ddat
  1199.     move.w    Dfor,Dtop        ;Dfor
  1200.                     ;Dfor>=Rbak        Dfor<Rbak
  1201.     sub.w    Rbak,Dtop        ;Dfor-Rbak        Dfor-Rbak+65536
  1202.     subx.w    Dtmp,Dtmp        ;0            -1
  1203.     mulu.w    Dscnt,Dtop        ;(Dfor-Rbak)*RATE*65536    (Dfor-Rbak+65536)*RATE*65536
  1204.     and.w    Dscnt,Dtmp        ;0            RATE*65536
  1205.     swap.w    Dtop            ;(Dfor-Rbak)*RATE    (Dfor-Rbak+65536)*RATE
  1206.     sub.w    Dtmp,Dtop        ;(Dfor-Rbak)*RATE    (Dfor-Rbak)*RATE
  1207.     add.w    Rbak,Dtop        ;Rbak+(Dfor-Rbak)*RATE
  1208.     add.w    Dtop,Ddat
  1209.     roxr.w    #1,Ddat
  1210.     bra    12f
  1211. ;2区間にまたがる
  1212. 11:    move.w    Dfor,Ddat
  1213.     add.w    Dtop,Ddat
  1214.     roxr.w    #1,Ddat            ;(Dtop+Dfor)/2
  1215.     move.w    Rsrat,Dtmp
  1216.     sub.w    Dscnt,Dtmp        ;(Rsrat.w-Dscnt.w).w
  1217.     mulu.w    Dtmp,Ddat        ;(Dtop+Dfor)/2*(Rsrat.w-Dscnt.w).w
  1218.     move.w    Dfor,Rbak
  1219.     cmp.l    Alim,Asrc
  1220.     bhs    @epp
  1221. @spp:    GET_DATA_&side    Asrc,Dfor,Dtmp
  1222.     add.w    #$8000,Dfor
  1223.     move.w    Dfor,Dtop        ;Dfor
  1224.                     ;Dfor>=Rbak        Dfor<Rbak
  1225.     sub.w    Rbak,Dtop        ;Dfor-Rbak        Dfor-Rbak+65536
  1226.     subx.w    Dtmp,Dtmp        ;0            -1
  1227.     mulu.w    Dscnt,Dtop        ;(Dfor-Rbak)*RATE*65536    (Dfor-Rbak+65536)*RATE*65536
  1228.     and.w    Dscnt,Dtmp        ;0            RATE*65536
  1229.     swap.w    Dtop            ;(Dfor-Rbak)*RATE    (Dfor-Rbak+65536)*RATE
  1230.     sub.w    Dtmp,Dtop        ;(Dfor-Rbak)*RATE    (Dfor-Rbak)*RATE
  1231.     add.w    Rbak,Dtop        ;Rbak+(Dfor-Rbak)*RATE
  1232.     move.w    Rbak,Dtmp
  1233.     add.w    Dtop,Dtmp
  1234.     roxr.w    #1,Dtmp            ;(Rbak+Dtop)/2
  1235.     mulu.w    Dscnt,Dtmp        ;(Rbak+Dtop)/2*Dscnt.w
  1236.     add.l    Dtmp,Ddat        ;面積
  1237.     move.w    sq_n,Dtmp
  1238.     lsr.l    Dtmp,Ddat
  1239.     mulu.w    sq_inv,Ddat
  1240.     moveq.l    #14,Dtmp
  1241.     lsr.l    Dtmp,Ddat
  1242. 12:    sub.w    #$8000,Ddat
  1243.     bhi    @dpp
  1244.     beq    @dpm
  1245.     move.w    Ddat,Dtmp
  1246.     add.w    Rpre,Dtmp
  1247.     blt    @xmm
  1248. @dpm:    move.b    (Atbl,Rpre.w),(Adst)+
  1249.     if side,<addq.l #1,Adst>
  1250. @vpm:    move.w    Ddat,Rpre
  1251.     add.w    Rsrat,Dscnt
  1252.     bcs    11f
  1253. ;2区間にまたがらない
  1254.     move.w    Dtop,Ddat
  1255.     move.w    Dfor,Dtop        ;Dfor
  1256.                     ;Dfor>=Rbak        Dfor<Rbak
  1257.     sub.w    Rbak,Dtop        ;Dfor-Rbak        Dfor-Rbak+65536
  1258.     subx.w    Dtmp,Dtmp        ;0            -1
  1259.     mulu.w    Dscnt,Dtop        ;(Dfor-Rbak)*RATE*65536    (Dfor-Rbak+65536)*RATE*65536
  1260.     and.w    Dscnt,Dtmp        ;0            RATE*65536
  1261.     swap.w    Dtop            ;(Dfor-Rbak)*RATE    (Dfor-Rbak+65536)*RATE
  1262.     sub.w    Dtmp,Dtop        ;(Dfor-Rbak)*RATE    (Dfor-Rbak)*RATE
  1263.     add.w    Rbak,Dtop        ;Rbak+(Dfor-Rbak)*RATE
  1264.     add.w    Dtop,Ddat
  1265.     roxr.w    #1,Ddat
  1266.     bra    12f
  1267. ;2区間にまたがる
  1268. 11:    move.w    Dfor,Ddat
  1269.     add.w    Dtop,Ddat
  1270.     roxr.w    #1,Ddat            ;(Dtop+Dfor)/2
  1271.     move.w    Rsrat,Dtmp
  1272.     sub.w    Dscnt,Dtmp        ;(Rsrat.w-Dscnt.w).w
  1273.     mulu.w    Dtmp,Ddat        ;(Dtop+Dfor)/2*(Rsrat.w-Dscnt.w).w
  1274.     move.w    Dfor,Rbak
  1275.     cmp.l    Alim,Asrc
  1276.     bhs    @epm
  1277. @spm:    GET_DATA_&side    Asrc,Dfor,Dtmp
  1278.     add.w    #$8000,Dfor
  1279.     move.w    Dfor,Dtop        ;Dfor
  1280.                     ;Dfor>=Rbak        Dfor<Rbak
  1281.     sub.w    Rbak,Dtop        ;Dfor-Rbak        Dfor-Rbak+65536
  1282.     subx.w    Dtmp,Dtmp        ;0            -1
  1283.     mulu.w    Dscnt,Dtop        ;(Dfor-Rbak)*RATE*65536    (Dfor-Rbak+65536)*RATE*65536
  1284.     and.w    Dscnt,Dtmp        ;0            RATE*65536
  1285.     swap.w    Dtop            ;(Dfor-Rbak)*RATE    (Dfor-Rbak+65536)*RATE
  1286.     sub.w    Dtmp,Dtop        ;(Dfor-Rbak)*RATE    (Dfor-Rbak)*RATE
  1287.     add.w    Rbak,Dtop        ;Rbak+(Dfor-Rbak)*RATE
  1288.     move.w    Rbak,Dtmp
  1289.     add.w    Dtop,Dtmp
  1290.     roxr.w    #1,Dtmp            ;(Rbak+Dtop)/2
  1291.     mulu.w    Dscnt,Dtmp        ;(Rbak+Dtop)/2*Dscnt.w
  1292.     add.l    Dtmp,Ddat        ;面積
  1293.     move.w    sq_n,Dtmp
  1294.     lsr.l    Dtmp,Ddat
  1295.     mulu.w    sq_inv,Ddat
  1296.     moveq.l    #14,Dtmp
  1297.     lsr.l    Dtmp,Ddat
  1298. 12:    sub.w    #$8000,Ddat
  1299.     bhi    @npp
  1300.     beq    @npz
  1301. @xmm:    st.b    (Adst)+
  1302.     if side,<addq.l #1,Adst>
  1303.     bra    @vmm
  1304. @npz:    move.b    #$7F,(Adst)+
  1305.     if side,<addq.l #1,Adst>
  1306.     bra    @vpm
  1307.  
  1308. @nmm:    move.b    #$7F,(Adst)+
  1309.     if side,<addq.l #1,Adst>
  1310.     bra    @vmm
  1311. @dmm:    move.b    (Atbl,Rpre.w),(Adst)+
  1312.     if side,<addq.l #1,Adst>
  1313. @vmm:    move.w    Ddat,Rpre
  1314.     add.w    Rsrat,Dscnt
  1315.     bcs    11f
  1316. ;2区間にまたがらない
  1317.     move.w    Dtop,Ddat
  1318.     move.w    Dfor,Dtop        ;Dfor
  1319.                     ;Dfor>=Rbak        Dfor<Rbak
  1320.     sub.w    Rbak,Dtop        ;Dfor-Rbak        Dfor-Rbak+65536
  1321.     subx.w    Dtmp,Dtmp        ;0            -1
  1322.     mulu.w    Dscnt,Dtop        ;(Dfor-Rbak)*RATE*65536    (Dfor-Rbak+65536)*RATE*65536
  1323.     and.w    Dscnt,Dtmp        ;0            RATE*65536
  1324.     swap.w    Dtop            ;(Dfor-Rbak)*RATE    (Dfor-Rbak+65536)*RATE
  1325.     sub.w    Dtmp,Dtop        ;(Dfor-Rbak)*RATE    (Dfor-Rbak)*RATE
  1326.     add.w    Rbak,Dtop        ;Rbak+(Dfor-Rbak)*RATE
  1327.     add.w    Dtop,Ddat
  1328.     roxr.w    #1,Ddat
  1329.     bra    12f
  1330. ;2区間にまたがる
  1331. 11:    move.w    Dfor,Ddat
  1332.     add.w    Dtop,Ddat
  1333.     roxr.w    #1,Ddat            ;(Dtop+Dfor)/2
  1334.     move.w    Rsrat,Dtmp
  1335.     sub.w    Dscnt,Dtmp        ;(Rsrat.w-Dscnt.w).w
  1336.     mulu.w    Dtmp,Ddat        ;(Dtop+Dfor)/2*(Rsrat.w-Dscnt.w).w
  1337.     move.w    Dfor,Rbak
  1338.     cmp.l    Alim,Asrc
  1339.     bhs    @emm
  1340. @smm:    GET_DATA_&side    Asrc,Dfor,Dtmp
  1341.     add.w    #$8000,Dfor
  1342.     move.w    Dfor,Dtop        ;Dfor
  1343.                     ;Dfor>=Rbak        Dfor<Rbak
  1344.     sub.w    Rbak,Dtop        ;Dfor-Rbak        Dfor-Rbak+65536
  1345.     subx.w    Dtmp,Dtmp        ;0            -1
  1346.     mulu.w    Dscnt,Dtop        ;(Dfor-Rbak)*RATE*65536    (Dfor-Rbak+65536)*RATE*65536
  1347.     and.w    Dscnt,Dtmp        ;0            RATE*65536
  1348.     swap.w    Dtop            ;(Dfor-Rbak)*RATE    (Dfor-Rbak+65536)*RATE
  1349.     sub.w    Dtmp,Dtop        ;(Dfor-Rbak)*RATE    (Dfor-Rbak)*RATE
  1350.     add.w    Rbak,Dtop        ;Rbak+(Dfor-Rbak)*RATE
  1351.     move.w    Rbak,Dtmp
  1352.     add.w    Dtop,Dtmp
  1353.     roxr.w    #1,Dtmp            ;(Rbak+Dtop)/2
  1354.     mulu.w    Dscnt,Dtmp        ;(Rbak+Dtop)/2*Dscnt.w
  1355.     add.l    Dtmp,Ddat        ;面積
  1356.     move.w    sq_n,Dtmp
  1357.     lsr.l    Dtmp,Ddat
  1358.     mulu.w    sq_inv,Ddat
  1359.     moveq.l    #14,Dtmp
  1360.     lsr.l    Dtmp,Ddat
  1361. 12:    sub.w    #$8000,Ddat
  1362.     blo    @dmm
  1363.     beq    @dmp
  1364.     move.w    Ddat,Dtmp
  1365.     add.w    Rpre,Dtmp
  1366.     bgt    @xpp
  1367. @dmp:    move.b    (Atbl,Rpre.w),(Adst)+
  1368.     if side,<addq.l #1,Adst>
  1369. @vmp:    move.w    Ddat,Rpre
  1370.     add.w    Rsrat,Dscnt
  1371.     bcs    11f
  1372. ;2区間にまたがらない
  1373.     move.w    Dtop,Ddat
  1374.     move.w    Dfor,Dtop        ;Dfor
  1375.                     ;Dfor>=Rbak        Dfor<Rbak
  1376.     sub.w    Rbak,Dtop        ;Dfor-Rbak        Dfor-Rbak+65536
  1377.     subx.w    Dtmp,Dtmp        ;0            -1
  1378.     mulu.w    Dscnt,Dtop        ;(Dfor-Rbak)*RATE*65536    (Dfor-Rbak+65536)*RATE*65536
  1379.     and.w    Dscnt,Dtmp        ;0            RATE*65536
  1380.     swap.w    Dtop            ;(Dfor-Rbak)*RATE    (Dfor-Rbak+65536)*RATE
  1381.     sub.w    Dtmp,Dtop        ;(Dfor-Rbak)*RATE    (Dfor-Rbak)*RATE
  1382.     add.w    Rbak,Dtop        ;Rbak+(Dfor-Rbak)*RATE
  1383.     add.w    Dtop,Ddat
  1384.     roxr.w    #1,Ddat
  1385.     bra    12f
  1386. ;2区間にまたがる
  1387. 11:    move.w    Dfor,Ddat
  1388.     add.w    Dtop,Ddat
  1389.     roxr.w    #1,Ddat            ;(Dtop+Dfor)/2
  1390.     move.w    Rsrat,Dtmp
  1391.     sub.w    Dscnt,Dtmp        ;(Rsrat.w-Dscnt.w).w
  1392.     mulu.w    Dtmp,Ddat        ;(Dtop+Dfor)/2*(Rsrat.w-Dscnt.w).w
  1393.     move.w    Dfor,Rbak
  1394.     cmp.l    Alim,Asrc
  1395.     bhs    @emp
  1396. @smp:    GET_DATA_&side    Asrc,Dfor,Dtmp
  1397.     add.w    #$8000,Dfor
  1398.     move.w    Dfor,Dtop        ;Dfor
  1399.                     ;Dfor>=Rbak        Dfor<Rbak
  1400.     sub.w    Rbak,Dtop        ;Dfor-Rbak        Dfor-Rbak+65536
  1401.     subx.w    Dtmp,Dtmp        ;0            -1
  1402.     mulu.w    Dscnt,Dtop        ;(Dfor-Rbak)*RATE*65536    (Dfor-Rbak+65536)*RATE*65536
  1403.     and.w    Dscnt,Dtmp        ;0            RATE*65536
  1404.     swap.w    Dtop            ;(Dfor-Rbak)*RATE    (Dfor-Rbak+65536)*RATE
  1405.     sub.w    Dtmp,Dtop        ;(Dfor-Rbak)*RATE    (Dfor-Rbak)*RATE
  1406.     add.w    Rbak,Dtop        ;Rbak+(Dfor-Rbak)*RATE
  1407.     move.w    Rbak,Dtmp
  1408.     add.w    Dtop,Dtmp
  1409.     roxr.w    #1,Dtmp            ;(Rbak+Dtop)/2
  1410.     mulu.w    Dscnt,Dtmp        ;(Rbak+Dtop)/2*Dscnt.w
  1411.     add.l    Dtmp,Ddat        ;面積
  1412.     move.w    sq_n,Dtmp
  1413.     lsr.l    Dtmp,Ddat
  1414.     mulu.w    sq_inv,Ddat
  1415.     moveq.l    #14,Dtmp
  1416.     lsr.l    Dtmp,Ddat
  1417. 12:    sub.w    #$8000,Ddat
  1418.     blo    @nmm
  1419.     beq    @nmz
  1420. @xpp:    st.b    (Adst)+
  1421.     if side,<addq.l #1,Adst>
  1422.     bra    @vpp
  1423. @nmz:    move.b    #$7F,(Adst)+
  1424.     if side,<addq.l #1,Adst>
  1425.     bra    @vmp
  1426.  
  1427. @epp:    lea.l    (@spp,pc),Ajmp
  1428.     bra    @done
  1429.  
  1430. @epm:    lea.l    (@spm,pc),Ajmp
  1431.     bra    @done
  1432.  
  1433. @emm:    lea.l    (@smm,pc),Ajmp
  1434.     bra    @done
  1435.  
  1436. @emp:    lea.l    (@smp,pc),Ajmp
  1437.     bra    @done
  1438.  
  1439. @done:
  1440.     .endm
  1441. PRECONV_EXIT_UP_SQ    .macro    side
  1442.     move.l    Ajmp,preconv_jmp_&side
  1443.     move.w    Rpre,preconv_pre_&side
  1444.     move.w    Dscnt,preconv_scnt_&side+2
  1445.     move.w    Dfor,preconv_for_&side
  1446.     move.w    Rbak,preconv_bak_&side
  1447.     move.l    Ddat,preconv_dat_&side
  1448.     .endm
  1449.  
  1450. ;----------------------------------------------------------------
  1451. ;<Super Quality>
  1452. ;間隔が伸びる→周波数が下がる
  1453. ;    side    0=Mono,1=StereoLeft,2=StereoRight
  1454. ;Ddat    dn
  1455. ;Dfor    dn
  1456. ;Rpre    dn/an
  1457. ;Rbak    dn/an
  1458. ;Dtmp    dn
  1459. ;Dscnt    dn
  1460. ;Dtop    dn    sq only
  1461. ;Atbl    an
  1462. ;Asrc    an
  1463. ;Adst    an
  1464. ;Ajmp    an
  1465. ;Rsone    dn/an    const
  1466. ;Rsrat    dn/an
  1467. ;Alim    dn/an
  1468. PRECONV_DOWN_SQ    .macro    side
  1469.     move.l    preconv_dat_&side,Ddat
  1470.     move.w    preconv_for_&side,Dfor
  1471.     move.w    preconv_bak_&side,Rbak
  1472.     move.l    preconv_scnt_&side,Dscnt
  1473.     move.w    preconv_pre_&side,Rpre
  1474.     move.l    preconv_jmp_&side,Ajmp
  1475.     move.l    speed_rate,Rsrat
  1476.     move.l    #65536,Rsone
  1477.     move.l    Ajmp,Dtmp
  1478.     beq    @spp
  1479.     jmp    (Ajmp)
  1480.  
  1481. @npp:    move.b    #$7F,(Adst)+
  1482.     if side,<addq.l #1,Adst>
  1483.     bra    @vpp
  1484. @dpp:    move.b    (Atbl,Rpre.w),(Adst)+
  1485.     if side,<addq.l #1,Adst>
  1486. @vpp:    move.w    Ddat,Rpre
  1487.     move.w    Dfor,Ddat
  1488.     add.w    Dtop,Ddat
  1489.     roxr.w    #1,Ddat            ;(Dtop+Dfor)/2
  1490.     move.w    Dscnt,Dtmp
  1491.     neg.w    Dtmp            ;65536-Dscnt.w
  1492.     bne    21f
  1493.     swap.w    Ddat
  1494.     clr.w    Ddat
  1495.     bra    22f
  1496. 21:    mulu.w    Dtmp,Ddat        ;(Dtop+Dfor)/2*(65536-Dscnt.w)
  1497. 22:    move.w    sq_n_16,Dtmp
  1498.     lsr.l    Dtmp,Ddat        ;(Dtop+Dfor)/2*(65536-Dscnt.w)>>sq_n_16
  1499.     add.l    Rsrat,Dscnt
  1500.     sub.l    Rsone,Dscnt
  1501.     bmi    12f
  1502. 11:    move.w    Dfor,Rbak
  1503.     cmp.l    Alim,Asrc
  1504.     bhs    @epp
  1505. @spp:    GET_DATA_&side    Asrc,Dfor,Dtmp
  1506.     add.w    #$8000,Dfor
  1507.     move.w    Dfor,Dtmp
  1508.     add.w    Rbak,Dtmp
  1509.     roxr.w    #1,Dtmp            ;(Rbak+Dfor)/2
  1510.     swap.w    Dtmp
  1511.     clr.w    Dtmp
  1512.     move.w    sq_n_16,Rbak
  1513.     lsr.l    Rbak,Dtmp        ;(Rbak+Dfor)/2*65536>>sq_n_16
  1514.     add.l    Dtmp,Ddat
  1515.     sub.l    Rsone,Dscnt
  1516.     bpl    11b
  1517. 12:    move.w    Dfor,Rbak
  1518.     cmp.l    Alim,Asrc
  1519.     bhs    @fpp
  1520. @upp:    GET_DATA_&side    Asrc,Dfor,Dtmp
  1521.     add.w    #$8000,Dfor
  1522.     move.w    Dfor,Dtop        ;Dfor
  1523.                     ;Dfor>=Rbak        Dfor<Rbak
  1524.     sub.w    Rbak,Dtop        ;Dfor-Rbak        Dfor-Rbak+65536
  1525.     subx.w    Dtmp,Dtmp        ;0            -1
  1526.     mulu.w    Dscnt,Dtop        ;(Dfor-Rbak)*RATE*65536    (Dfor-Rbak+65536)*RATE*65536
  1527.     and.w    Dscnt,Dtmp        ;0            RATE*65536
  1528.     swap.w    Dtop            ;(Dfor-Rbak)*RATE    (Dfor-Rbak+65536)*RATE
  1529.     sub.w    Dtmp,Dtop        ;(Dfor-Rbak)*RATE    (Dfor-Rbak)*RATE
  1530.     add.w    Rbak,Dtop        ;Rbak+(Dfor-Rbak)*RATE
  1531.     move.w    Dtop,Dtmp
  1532.     add.w    Rbak,Dtmp
  1533.     roxr.w    #1,Dtmp            ;(Rbak+Dtop)/2
  1534.     mulu.w    Dscnt,Dtmp        ;(Rbak+Dtop)/2*Dscnt.w
  1535.     move.w    sq_n_16,Rbak
  1536.     lsr.l    Rbak,Dtmp        ;(Rbak+Dfor)/2*Dscnt.w>>sq_n_16
  1537.     add.l    Dtmp,Ddat
  1538.     swap.w    Ddat
  1539.     mulu.w    sq_inv,Ddat
  1540.     moveq.l    #14,Dtmp
  1541.     lsr.l    Dtmp,Ddat
  1542.     sub.w    #$8000,Ddat
  1543.     bhi    @dpp
  1544.     beq    @dpm
  1545.     move.w    Ddat,Dtmp
  1546.     add.w    Rpre,Dtmp
  1547.     blt    @xmm
  1548. @dpm:    move.b    (Atbl,Rpre.w),(Adst)+
  1549.     if side,<addq.l #1,Adst>
  1550. @vpm:    move.w    Ddat,Rpre
  1551.     move.w    Dfor,Ddat
  1552.     add.w    Dtop,Ddat
  1553.     roxr.w    #1,Ddat            ;(Dtop+Dfor)/2
  1554.     move.w    Dscnt,Dtmp
  1555.     neg.w    Dtmp            ;65536-Dscnt.w
  1556.     bne    21f
  1557.     swap.w    Ddat
  1558.     clr.w    Ddat
  1559.     bra    22f
  1560. 21:    mulu.w    Dtmp,Ddat        ;(Dtop+Dfor)/2*(65536-Dscnt.w)
  1561. 22:    move.w    sq_n_16,Dtmp
  1562.     lsr.l    Dtmp,Ddat        ;(Dtop+Dfor)/2*(65536-Dscnt.w)>>sq_n_16
  1563.     add.l    Rsrat,Dscnt
  1564.     sub.l    Rsone,Dscnt
  1565.     bmi    12f
  1566. 11:    move.w    Dfor,Rbak
  1567.     cmp.l    Alim,Asrc
  1568.     bhs    @epm
  1569. @spm:    GET_DATA_&side    Asrc,Dfor,Dtmp
  1570.     add.w    #$8000,Dfor
  1571.     move.w    Dfor,Dtmp
  1572.     add.w    Rbak,Dtmp
  1573.     roxr.w    #1,Dtmp            ;(Rbak+Dfor)/2
  1574.     swap.w    Dtmp
  1575.     clr.w    Dtmp
  1576.     move.w    sq_n_16,Rbak
  1577.     lsr.l    Rbak,Dtmp        ;(Rbak+Dfor)/2*65536>>sq_n_16
  1578.     add.l    Dtmp,Ddat
  1579.     sub.l    Rsone,Dscnt
  1580.     bpl    11b
  1581. 12:    move.w    Dfor,Rbak
  1582.     cmp.l    Alim,Asrc
  1583.     bhs    @fpm
  1584. @upm:    GET_DATA_&side    Asrc,Dfor,Dtmp
  1585.     add.w    #$8000,Dfor
  1586.     move.w    Dfor,Dtop        ;Dfor
  1587.                     ;Dfor>=Rbak        Dfor<Rbak
  1588.     sub.w    Rbak,Dtop        ;Dfor-Rbak        Dfor-Rbak+65536
  1589.     subx.w    Dtmp,Dtmp        ;0            -1
  1590.     mulu.w    Dscnt,Dtop        ;(Dfor-Rbak)*RATE*65536    (Dfor-Rbak+65536)*RATE*65536
  1591.     and.w    Dscnt,Dtmp        ;0            RATE*65536
  1592.     swap.w    Dtop            ;(Dfor-Rbak)*RATE    (Dfor-Rbak+65536)*RATE
  1593.     sub.w    Dtmp,Dtop        ;(Dfor-Rbak)*RATE    (Dfor-Rbak)*RATE
  1594.     add.w    Rbak,Dtop        ;Rbak+(Dfor-Rbak)*RATE
  1595.     move.w    Dtop,Dtmp
  1596.     add.w    Rbak,Dtmp
  1597.     roxr.w    #1,Dtmp            ;(Rbak+Dtop)/2
  1598.     mulu.w    Dscnt,Dtmp        ;(Rbak+Dtop)/2*Dscnt.w
  1599.     move.w    sq_n_16,Rbak
  1600.     lsr.l    Rbak,Dtmp        ;(Rbak+Dfor)/2*Dscnt.w>>sq_n_16
  1601.     add.l    Dtmp,Ddat
  1602.     swap.w    Ddat
  1603.     mulu.w    sq_inv,Ddat
  1604.     moveq.l    #14,Dtmp
  1605.     lsr.l    Dtmp,Ddat
  1606.     sub.w    #$8000,Ddat
  1607.     bhi    @npp
  1608.     beq    @npz
  1609. @xmm:    st.b    (Adst)+
  1610.     if side,<addq.l #1,Adst>
  1611.     bra    @vmm
  1612. @npz:    move.b    #$7F,(Adst)+
  1613.     if side,<addq.l #1,Adst>
  1614.     bra    @vpm
  1615.  
  1616. @nmm:    move.b    #$7F,(Adst)+
  1617.     if side,<addq.l #1,Adst>
  1618.     bra    @vmm
  1619. @dmm:    move.b    (Atbl,Rpre.w),(Adst)+
  1620.     if side,<addq.l #1,Adst>
  1621. @vmm:    move.w    Ddat,Rpre
  1622.     move.w    Dfor,Ddat
  1623.     add.w    Dtop,Ddat
  1624.     roxr.w    #1,Ddat            ;(Dtop+Dfor)/2
  1625.     move.w    Dscnt,Dtmp
  1626.     neg.w    Dtmp            ;65536-Dscnt.w
  1627.     bne    21f
  1628.     swap.w    Ddat
  1629.     clr.w    Ddat
  1630.     bra    22f
  1631. 21:    mulu.w    Dtmp,Ddat        ;(Dtop+Dfor)/2*(65536-Dscnt.w)
  1632. 22:    move.w    sq_n_16,Dtmp
  1633.     lsr.l    Dtmp,Ddat        ;(Dtop+Dfor)/2*(65536-Dscnt.w)>>sq_n_16
  1634.     add.l    Rsrat,Dscnt
  1635.     sub.l    Rsone,Dscnt
  1636.     bmi    12f
  1637. 11:    move.w    Dfor,Rbak
  1638.     cmp.l    Alim,Asrc
  1639.     bhs    @emm
  1640. @smm:    GET_DATA_&side    Asrc,Dfor,Dtmp
  1641.     add.w    #$8000,Dfor
  1642.     move.w    Dfor,Dtmp
  1643.     add.w    Rbak,Dtmp
  1644.     roxr.w    #1,Dtmp            ;(Rbak+Dfor)/2
  1645.     swap.w    Dtmp
  1646.     clr.w    Dtmp
  1647.     move.w    sq_n_16,Rbak
  1648.     lsr.l    Rbak,Dtmp        ;(Rbak+Dfor)/2*65536>>sq_n_16
  1649.     add.l    Dtmp,Ddat
  1650.     sub.l    Rsone,Dscnt
  1651.     bpl    11b
  1652. 12:    move.w    Dfor,Rbak
  1653.     cmp.l    Alim,Asrc
  1654.     bhs    @fmm
  1655. @umm:    GET_DATA_&side    Asrc,Dfor,Dtmp
  1656.     add.w    #$8000,Dfor
  1657.     move.w    Dfor,Dtop        ;Dfor
  1658.                     ;Dfor>=Rbak        Dfor<Rbak
  1659.     sub.w    Rbak,Dtop        ;Dfor-Rbak        Dfor-Rbak+65536
  1660.     subx.w    Dtmp,Dtmp        ;0            -1
  1661.     mulu.w    Dscnt,Dtop        ;(Dfor-Rbak)*RATE*65536    (Dfor-Rbak+65536)*RATE*65536
  1662.     and.w    Dscnt,Dtmp        ;0            RATE*65536
  1663.     swap.w    Dtop            ;(Dfor-Rbak)*RATE    (Dfor-Rbak+65536)*RATE
  1664.     sub.w    Dtmp,Dtop        ;(Dfor-Rbak)*RATE    (Dfor-Rbak)*RATE
  1665.     add.w    Rbak,Dtop        ;Rbak+(Dfor-Rbak)*RATE
  1666.     move.w    Dtop,Dtmp
  1667.     add.w    Rbak,Dtmp
  1668.     roxr.w    #1,Dtmp            ;(Rbak+Dtop)/2
  1669.     mulu.w    Dscnt,Dtmp        ;(Rbak+Dtop)/2*Dscnt.w
  1670.     move.w    sq_n_16,Rbak
  1671.     lsr.l    Rbak,Dtmp        ;(Rbak+Dfor)/2*Dscnt.w>>sq_n_16
  1672.     add.l    Dtmp,Ddat
  1673.     swap.w    Ddat
  1674.     mulu.w    sq_inv,Ddat
  1675.     moveq.l    #14,Dtmp
  1676.     lsr.l    Dtmp,Ddat
  1677.     sub.w    #$8000,Ddat
  1678.     blo    @dmm
  1679.     beq    @dmp
  1680.     move.w    Ddat,Dtmp
  1681.     add.w    Rpre,Dtmp
  1682.     bgt    @xpp
  1683. @dmp:    move.b    (Atbl,Rpre.w),(Adst)+
  1684.     if side,<addq.l #1,Adst>
  1685. @vmp:    move.w    Ddat,Rpre
  1686.     move.w    Dfor,Ddat
  1687.     add.w    Dtop,Ddat
  1688.     roxr.w    #1,Ddat            ;(Dtop+Dfor)/2
  1689.     move.w    Dscnt,Dtmp
  1690.     neg.w    Dtmp            ;65536-Dscnt.w
  1691.     bne    21f
  1692.     swap.w    Ddat
  1693.     clr.w    Ddat
  1694.     bra    22f
  1695. 21:    mulu.w    Dtmp,Ddat        ;(Dtop+Dfor)/2*(65536-Dscnt.w)
  1696. 22:    move.w    sq_n_16,Dtmp
  1697.     lsr.l    Dtmp,Ddat        ;(Dtop+Dfor)/2*(65536-Dscnt.w)>>sq_n_16
  1698.     add.l    Rsrat,Dscnt
  1699.     sub.l    Rsone,Dscnt
  1700.     bmi    12f
  1701. 11:    move.w    Dfor,Rbak
  1702.     cmp.l    Alim,Asrc
  1703.     bhs    @emp
  1704. @smp:    GET_DATA_&side    Asrc,Dfor,Dtmp
  1705.     add.w    #$8000,Dfor
  1706.     move.w    Dfor,Dtmp
  1707.     add.w    Rbak,Dtmp
  1708.     roxr.w    #1,Dtmp            ;(Rbak+Dfor)/2
  1709.     swap.w    Dtmp
  1710.     clr.w    Dtmp
  1711.     move.w    sq_n_16,Rbak
  1712.     lsr.l    Rbak,Dtmp        ;(Rbak+Dfor)/2*65536>>sq_n_16
  1713.     add.l    Dtmp,Ddat
  1714.     sub.l    Rsone,Dscnt
  1715.     bpl    11b
  1716. 12:    move.w    Dfor,Rbak
  1717.     cmp.l    Alim,Asrc
  1718.     bhs    @fmp
  1719. @ump:    GET_DATA_&side    Asrc,Dfor,Dtmp
  1720.     add.w    #$8000,Dfor
  1721.     move.w    Dfor,Dtop        ;Dfor
  1722.                     ;Dfor>=Rbak        Dfor<Rbak
  1723.     sub.w    Rbak,Dtop        ;Dfor-Rbak        Dfor-Rbak+65536
  1724.     subx.w    Dtmp,Dtmp        ;0            -1
  1725.     mulu.w    Dscnt,Dtop        ;(Dfor-Rbak)*RATE*65536    (Dfor-Rbak+65536)*RATE*65536
  1726.     and.w    Dscnt,Dtmp        ;0            RATE*65536
  1727.     swap.w    Dtop            ;(Dfor-Rbak)*RATE    (Dfor-Rbak+65536)*RATE
  1728.     sub.w    Dtmp,Dtop        ;(Dfor-Rbak)*RATE    (Dfor-Rbak)*RATE
  1729.     add.w    Rbak,Dtop        ;Rbak+(Dfor-Rbak)*RATE
  1730.     move.w    Dtop,Dtmp
  1731.     add.w    Rbak,Dtmp
  1732.     roxr.w    #1,Dtmp            ;(Rbak+Dtop)/2
  1733.     mulu.w    Dscnt,Dtmp        ;(Rbak+Dtop)/2*Dscnt.w
  1734.     move.w    sq_n_16,Rbak
  1735.     lsr.l    Rbak,Dtmp        ;(Rbak+Dfor)/2*Dscnt.w>>sq_n_16
  1736.     add.l    Dtmp,Ddat
  1737.     swap.w    Ddat
  1738.     mulu.w    sq_inv,Ddat
  1739.     moveq.l    #14,Dtmp
  1740.     lsr.l    Dtmp,Ddat
  1741.     sub.w    #$8000,Ddat
  1742.     blo    @nmm
  1743.     beq    @nmz
  1744. @xpp:    st.b    (Adst)+
  1745.     if side,<addq.l #1,Adst>
  1746.     bra    @vpp
  1747. @nmz:    move.b    #$7F,(Adst)+
  1748.     if side,<addq.l #1,Adst>
  1749.     bra    @vmp
  1750.  
  1751. @epp:    lea.l    (@spp,pc),Ajmp
  1752.     bra    @done
  1753.  
  1754. @epm:    lea.l    (@spm,pc),Ajmp
  1755.     bra    @done
  1756.  
  1757. @emm:    lea.l    (@smm,pc),Ajmp
  1758.     bra    @done
  1759.  
  1760. @emp:    lea.l    (@smp,pc),Ajmp
  1761.     bra    @done
  1762.  
  1763. @fpp:    lea.l    (@upp,pc),Ajmp
  1764.     bra    @done
  1765.  
  1766. @fpm:    lea.l    (@upm,pc),Ajmp
  1767.     bra    @done
  1768.  
  1769. @fmm:    lea.l    (@umm,pc),Ajmp
  1770.     bra    @done
  1771.  
  1772. @fmp:    lea.l    (@ump,pc),Ajmp
  1773.     bra    @done
  1774.  
  1775. @done:
  1776.     .endm
  1777. PRECONV_EXIT_DOWN_SQ    .macro    side
  1778.     move.l    Ajmp,preconv_jmp_&side
  1779.     move.w    Rpre,preconv_pre_&side
  1780.     move.l    Dscnt,preconv_scnt_&side
  1781.     move.w    Dfor,preconv_for_&side
  1782.     move.w    Rbak,preconv_bak_&side
  1783.     move.l    Ddat,preconv_dat_&side
  1784.     .endm
  1785.  
  1786. ;----------------------------------------------------------------
  1787. ;面積補間
  1788. ;
  1789. ;@srat(=speed_rate):入力サンプリング間隔を65536としたときの出力サンプリング間隔
  1790. ;    65536よりも小さければサンプリング周波数が上がり,
  1791. ;    65536よりも大きければサンプリング周波数が下がる
  1792. ;@scnt:前の入力データの位置を0,次の入力データの位置を65536としたときの,
  1793. ;    次の直線補間の位置
  1794. ;@for:次の入力データ
  1795. ;@bak:前の入力データ
  1796. ;@top:次の直線補間データ
  1797. ;@dat:次の出力データ
  1798. ;@pre:前の出力データ
  1799. ;
  1800. ;nを次のように定める
  1801. ;    2^(n-1)<=@srat<2^n
  1802. ;    sq_n=n
  1803. ;    sq_n_16=n-16
  1804. ;n<=16のとき,@srat<65536であり,サンプリング間隔が縮む→周波数が上がる
  1805. ;n>=17のとき,@srat>=65536であり,サンプリング間隔が伸びる→周波数が下がる
  1806. ;
  1807. ;    2^(n-1)<=@srat<2^nより
  1808. ;    1/2<=@srat/2^n<1
  1809. ;    2>=2^n/@srat>1
  1810. ;    32768>=2^(n+14)/@srat>16384
  1811. ;
  1812. ;32768>=2^(n+14)/@srat>16384より,
  1813. ;2^(n+14)/@sratを求めておいて逆数乗算に使用する
  1814. ;この除算は演奏開始時に1回だけ行うので,浮動小数点演算による高精度の除算を使う
  1815. ;    sq_inv=2^(n+14)/@srat
  1816. ;
  1817. ;n<=16のとき@srat<65536であり,サンプリング間隔が縮む→周波数が上がる
  1818. ;    @pre=@dat
  1819. ;    @scnt.w+=@srat.w
  1820. ;キャリが立たなかったとき→2区間にまたがらない
  1821. ;    @dat=@top
  1822. ;    @top=@bak+(@for-@bak)*@scnt.w/65536    ;直線補間
  1823. ;    @dat=(@dat+@top)/2            ;台形の面積
  1824. ;キャリが立たったとき→2区間にまたがる
  1825. ;    @dat=(@top+@for)/2*(@srat.w-@scnt.w).w    ;最初の台形の面積
  1826. ;    @bak=@for
  1827. ;    @for=次の入力データ
  1828. ;    @top=@bak+(@for-@bak)*@scnt.w/65536    ;直線補間
  1829. ;    @dat+=(@bak+@top)/2*@scnt.w        ;最後の台形の面積
  1830. ;        面積<@srat*65536<2^(16+n)より,
  1831. ;        面積を右にnビットシフトして上位の16ビットだけ取り出す
  1832. ;    @dat>>=sq_n
  1833. ;    @dat*=sq_inv    ;逆数乗算
  1834. ;        (面積*2^(-n))*(2^(n+14)/@srat)=面積*2^14/@srat=平均の高さ*2^14
  1835. ;    @dat>>=14    ;平均の高さ
  1836. ;
  1837. ;n>=17のとき@srat>=65536であり,サンプリング間隔が伸びる→周波数が下がる
  1838. ;必ず2区間以上をまたぐ
  1839. ;    @pre=@dat
  1840. ;    @dat=(@top+@for)/2*(65536-@scnt.w)>>sq_n_16    ;最初の台形の面積
  1841. ;    @scnt.l+=@srat.l
  1842. ;    while((@scnt.l-=65536)>=0)
  1843. ;        @bak=@for
  1844. ;        @for=次の入力データ
  1845. ;        @dat+=(@bak+@for)/2*65536>>sq_n_16    ;途中の台形の面積
  1846. ;    endwhile
  1847. ;    @bak=@for
  1848. ;    @for=次の入力データ
  1849. ;    @top=@bak+(@for-@bak)*@scnt.w/65536    ;直線補間
  1850. ;    @dat+=(@bak+@top)/2*@scnt.w>>sq_n_16    ;最後の台形の面積
  1851. ;        この時点で@dat=面積/2^(n-16)=平均の高さ*@srat/2^(n-16)
  1852. ;    @dat/=65536
  1853. ;    @dat*=sq_inv
  1854. ;        @dat/65536*(2^(n+14)/@srat)
  1855. ;            =(平均の高さ*@srat/2^(n-16))/65536*(2^(n+14)/@srat)
  1856. ;            =平均の高さ*2^(16-n)*2^(-16)*2^(n+14)
  1857. ;            =平均の高さ*2^(14)
  1858. ;    @dat>>=14    ;平均の高さ
  1859.